package com.hzspace.springrediscache;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/*@CacheConfig这个注解在类上使用，用来描述该类中所有方法使用的缓存名称，示例代码如下：
(也可以不使用该注解，直接在具体的缓存注解上配置名称)*/
@CacheConfig(cacheNames = "c1")
@EnableCaching
@RestController
@SpringBootApplication
public class SpringRedisCacheApplication {

  public static void main(String[] args) {
    SpringApplication.run(SpringRedisCacheApplication.class, args);
  }


  /*这个注解一般加在查询方法上，表示将一个方法的返回值缓存起来，
  默认情况下，缓存的key就是方法的参数，缓存的value就是方法的返回值*/
  @GetMapping("/get")
  @Cacheable(key = "#id")
  public User getById(Integer id, String name) {
    User user = new User();
    user.setId(id);
    user.setName(name);
    //TODO 插入数据库
    return user;
  }


  /*这个注解一般加在更新方法上，当数据库中的数据更新后，
  缓存中的数据也要跟着更新，使用该注解，可以将方法的返回值自动更新到已经存在的key上*/
  @GetMapping("/put")
  @CachePut(key = "#user.id")
  public User updateById(User user) {
    //TODO 更新数据库
    return user;
  }

  /*这个注解一般加在删除方法上，当数据库中的数据删除后，
  相关的缓存数据也要自动清除，该注解在使用的时候也可以配置按照某种条件删除（condition属性）
  或者或者配置清除所有缓存（allEntries属性）*/
  @GetMapping("/delete")
  @CacheEvict
  public void deleteById(Integer id) {
    //TODO 执行删除数据库的操作
    System.out.println("...");
  }
}
